package com.stardata.liangshisq.tcslmon.service;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.IService;
import com.stardata.liangshisq.tcslmon.entity.ObjectSyncLog;
import org.jetbrains.annotations.NotNull;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * @author Samson Shu
 * @email shush@stardata.top
 * @date 2020/7/31 14:55
 */

@DS("canyin")
public interface ObjectSyncLogService extends IService<ObjectSyncLog> {
  /**
   * 查询从指定ID开始的所有待同步更新的订单id列表，并返回新的最大同步log ID
   * @param lastSyncLogId 从指定的同步Log ID之后开始查询（不包含该id)
   * @param bizBsIdsForSync 将查询到的待更新订单ID列表放到该 List 对象
   * @return 返回新的最大同步log ID
   */
  @NotNull
  Long queryBizBsIdsForSync(@NotNull Long lastSyncLogId,
                            @NotNull List<Long> bizBsIdsForSync);

  /**
   * 同步列表的所有订单信息到云服务器、相关客户端等
   * @param bizBsIds 待同步的订单ID列表
   */
  void synchronizeBizBs(@NotNull Long newLastSyncLogId,
                        @NotNull List<Long> bizBsIds);

  /**
   * 查询从指定ID开始的所有待通知后厨终端PC的菜品项id列表，并返回新的最大同步log ID
   * @param lastSyncLogId 从指定的同步Log ID之后开始查询（不包含该id)
   * @param itemNotifications 将查询到的待通知的信息列表（HashMap第一层为通知类型、第二层为该类型下的菜品项ID列表）放到该 List 对象
   * @return 返回新的最大同步log ID
   */
  @NotNull
  Long queryItemNotifications(@NotNull Long lastSyncLogId,
                              @NotNull List<Map<String, List<Long>>> itemNotifications);

  /**
   * 向后厨终端发送通知，更新最新的同步LOG ID
   * @param newLastSyncLogId 新的最新同步LOGID
   * @param notifications 待发送的通知列表
   */
  @Transactional(rollbackFor = {Exception.class})
  void notifyKitchen(@NotNull Long newLastSyncLogId, @NotNull List<Map<String, List<Long>>> notifications);

  /**
   * 刷新后厨配菜排队，并更新最新的同步LOG ID
   * @param newLastSyncLogId 新的最新同步LOGID
   * @param notifications 待发送的通知列表
   */
  @Transactional(rollbackFor = {Exception.class})
  void refreshItemOueue(@NotNull Long newLastSyncLogId, @NotNull List<Map<String, List<Long>>> notifications);
}
